home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / asm_msc1.arc / EX510.ASM < prev    next >
Assembly Source File  |  1988-11-20  |  2KB  |  69 lines

  1. TITLE  Cosine of an Angle (EX510.ASM)
  2.           PAGE      ,132
  3. DATA      SEGMENT   PARA 'DATA'
  4. SINES  DW  0,175,349,523,698,872     ;0-5
  5.        DW  1045,1219,1392,1564,1736  ;6-10
  6.        DW  1908,2079,2250,2419,2588  ;11-15
  7.        DW  2756,2924,3090,3256,3420  ;16-20
  8.        DW  3584,3746,3907,4067,4226  ;21-25
  9.        DW  4384,4540,4695,4848,5000  ;26-30
  10.        DW  5150,5299,5446,5592,5736  ;31-35
  11.        DW  5878,6018,6157,6293,6428  ;36-40
  12.        DW  6561,6691,6820,6947,7071  ;41-45
  13.        DW  7193,7313,7431,7547,7660  ;46-50
  14.        DW  7771,7880,7986,8090,8191  ;51-55
  15.        DW  8290,8387,8480,8572,8660  ;56-60
  16.        DW  8746,8829,8910,8988,9063  ;61-65
  17.        DW  9135,9205,9272,9336,9397  ;66-70
  18.        DW  9455,9511,9563,9613,9659  ;71-75
  19.        DW  9703,9744,9781,9816,9848  ;76-80
  20.        DW  9877,9903,9926,9945,9962  ;81-85
  21.        DW  9976,9986,9994,9998,10000 ;86-90
  22. DATA      ENDS
  23. OUR_CODE  SEGMENT   PARA 'CODE'
  24.       PUBLIC    FIND_COS
  25. FIND_COS  PROC      FAR
  26.           ASSUME    CS:OUR_CODE,DS:DATA
  27.       PUSH        DS             ;Save the caller's registers
  28.       PUSH        AX
  29.       PUSH        CX
  30. ;
  31. ;  Initialize the data segment address.
  32. ;
  33.       MOV        BX,DATA
  34.       MOV       DS,BX
  35. ;
  36. ;  This is the main procedure.
  37. ;
  38.       ADD        AX,90         ;Add 90 for use by FIND_SINE
  39.       CMP        AX,360         ;Is the result > 360?
  40.       JNA        GET_COS
  41.       SUB        AX,360         ; If so, subtract 360
  42. GET_COS:  CALL      FIND_SINE         ;Look up the cosine
  43.       POP        CX
  44.       POP        AX
  45.       POP        DS
  46.       RET
  47. FIND_COS  ENDP
  48. ;
  49. ;  This is the FIND_SINE procedure.
  50. ;
  51. FIND_SINE  PROC
  52.       SUB        CX,CX         ;Initialize sign to 0
  53.       CMP        AX,181         ;Angle < 181 degrees?
  54.       JB        SIN_POS         ; Yes.  Continue with sign = 0
  55.       MOV        CX,8000H         ; No.  Set sign = 1
  56.       SUB        AX,180         ;  and subtract 180 from angle
  57. SIN_POS:  CMP        AX,91         ;Angle < 91 degrees?
  58.       JB        GET_SIN         ; Yes.  Go look up sine
  59.       NEG        AX                 ; No.  Subtract angle from 180
  60.       ADD        AX,180
  61. GET_SIN:  MOV        BX,AX         ;Make angle a word index
  62.       SHL       BX,1
  63.       MOV        BX,SINES[BX]     ; and look up the sine value
  64.       OR        BX,CX         ;Combine sine with sign bit
  65.       RET                 ; and exit
  66. FIND_SINE ENDP
  67. OUR_CODE  ENDS
  68.           END   FIND_COS
  69.